/*
 * (C) Copyright 2006-2010 Nuxeo SAS (http://nuxeo.com/) and contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser General Public License
 * (LGPL) version 2.1 which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl.html
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * Contributors:
 *     bstefanescu
 */
package org.nuxeo.gwt.habyt.app.client;

import java.io.Serializable;
import java.util.Map;

import org.nuxeo.gwt.habyt.invocation.client.PropertyMap;

import com.google.gwt.user.client.ui.Widget;

/**
 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
 * 
 */
public class ActionContext {

    protected Widget trigger;

    protected PropertyMap parameters;

    protected Object content;

    public ActionContext() {
        this(null, new PropertyMap(), null);
    }

    public ActionContext(Widget trigger) {
        this(trigger, new PropertyMap(), null);
    }

    public ActionContext(Widget trigger, Object content) {
        this(trigger, new PropertyMap(), content);
    }

    public ActionContext(Widget trigger, PropertyMap params, Object content) {
        parameters = params;
        this.trigger = trigger;
        this.content = content;
    }

    public Widget getTrigger() {
        return trigger;
    }

    public void setTrigger(Widget trigger) {
        this.trigger = trigger;
    }

    public Object getContent() {
        return content;
    }

    public void setContent(Object content) {
        this.content = content;
    }

    public PropertyMap getParameters() {
        return parameters;
    }

    public void setParameters(Map<String, Serializable> params) {
        parameters.putAll(params);
    }

    public View findTarget(Action<?> action) {
        View view = null;
        if (action.getType() != null) {
            view = Application.get().getView(action.getTarget());
        }
        if (view == null) {
            view = findEnclosingView();
        }
        return view;
    }

    public View findEnclosingView() {
        Widget w = trigger;
        while (w != null) {
            if (w instanceof View) {
                return (View) w;
            }
            w = w.getParent();
        }
        return null;
    }
}
